package com.demo.job.handler;

import com.demo.job.feign.OrderFeignClient;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

/**
 * 秒杀相关定时任务处理器
 * 使用XXL-JOB框架执行定时任务
 */
@Slf4j
@Component
public class SeckillJobHandler {

    @Autowired
    private OrderFeignClient orderFeignClient;

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 取消超时订单定时任务
     * 每5分钟执行一次，取消超过30分钟未支付的订单
     */
    @XxlJob("cancelExpiredOrdersJob")
    public void cancelExpiredOrdersJob() {
        String currentTime = LocalDateTime.now().format(FORMATTER);
        log.info("开始执行取消超时订单定时任务，执行时间: {}", currentTime);
        
        try {
            // 记录任务开始时间
            long startTime = System.currentTimeMillis();
            
            // 调用订单服务取消超时订单
            Map<String, Object> result = orderFeignClient.cancelExpiredOrders();
            
            // 计算执行时间
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            
            if ((Boolean) result.get("success")) {
                String message = String.format("取消超时订单任务执行成功，耗时: %d ms，结果: %s", 
                        executionTime, result.get("message"));
                log.info(message);
                XxlJobHelper.log(message);
            } else {
                String errorMessage = String.format("取消超时订单任务执行失败，耗时: %d ms，错误: %s", 
                        executionTime, result.get("message"));
                log.error(errorMessage);
                XxlJobHelper.log(errorMessage);
                
                // 如果是降级处理，不抛异常，避免任务重试
                if (!Boolean.TRUE.equals(result.get("fallback"))) {
                    XxlJobHelper.handleFail("取消超时订单失败: " + result.get("message"));
                }
            }
            
        } catch (Exception e) {
            String errorMessage = String.format("取消超时订单任务执行异常，时间: %s，异常信息: %s", 
                    currentTime, e.getMessage());
            log.error(errorMessage, e);
            XxlJobHelper.log(errorMessage);
            XxlJobHelper.handleFail("任务执行异常: " + e.getMessage());
        }
    }

    /**
     * 系统健康检查定时任务
     * 每10分钟执行一次，检查各个服务的健康状态
     */
    @XxlJob("systemHealthCheckJob")
    public void systemHealthCheckJob() {
        String currentTime = LocalDateTime.now().format(FORMATTER);
        log.info("开始执行系统健康检查定时任务，执行时间: {}", currentTime);
        
        try {
            // 记录任务开始时间
            long startTime = System.currentTimeMillis();
            
            // 检查订单服务健康状态
            boolean orderServiceHealthy = checkOrderServiceHealth();
            
            // 计算执行时间
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            
            String message = String.format("系统健康检查完成，耗时: %d ms，订单服务状态: %s", 
                    executionTime, orderServiceHealthy ? "正常" : "异常");
            log.info(message);
            XxlJobHelper.log(message);
            
            if (!orderServiceHealthy) {
                XxlJobHelper.log("警告：订单服务健康检查失败");
            }
            
        } catch (Exception e) {
            String errorMessage = String.format("系统健康检查任务执行异常，时间: %s，异常信息: %s", 
                    currentTime, e.getMessage());
            log.error(errorMessage, e);
            XxlJobHelper.log(errorMessage);
            XxlJobHelper.handleFail("健康检查异常: " + e.getMessage());
        }
    }

    /**
     * 数据统计定时任务
     * 每天凌晨1点执行，统计前一天的秒杀数据
     */
    @XxlJob("dailyStatisticsJob")
    public void dailyStatisticsJob() {
        String currentTime = LocalDateTime.now().format(FORMATTER);
        log.info("开始执行每日数据统计定时任务，执行时间: {}", currentTime);
        
        try {
            // 记录任务开始时间
            long startTime = System.currentTimeMillis();
            
            // 这里可以添加具体的数据统计逻辑
            // 比如统计订单数量、成功率、热门商品等
            
            // 模拟统计过程
            Thread.sleep(1000);
            
            // 计算执行时间
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            
            String message = String.format("每日数据统计完成，耗时: %d ms", executionTime);
            log.info(message);
            XxlJobHelper.log(message);
            
        } catch (Exception e) {
            String errorMessage = String.format("每日数据统计任务执行异常，时间: %s，异常信息: %s", 
                    currentTime, e.getMessage());
            log.error(errorMessage, e);
            XxlJobHelper.log(errorMessage);
            XxlJobHelper.handleFail("数据统计异常: " + e.getMessage());
        }
    }

    /**
     * 检查订单服务健康状态
     * @return 是否健康
     */
    private boolean checkOrderServiceHealth() {
        try {
            // 通过调用订单服务的健康检查接口来判断服务状态
            // 这里简化处理，实际可以调用专门的健康检查接口
            Map<String, Object> result = orderFeignClient.cancelExpiredOrders();
            
            // 如果能正常调用（即使是降级），说明服务基本可用
            return result != null;
            
        } catch (Exception e) {
            log.error("订单服务健康检查失败", e);
            return false;
        }
    }
}